package main

import "fmt"

func main() {
	f()
	fmt.Println("M")
	// F D M

	//-------------------------

	person := &Person{28}

	// 1.会把 28 缓存在栈中，等到最后执行该 defer 语句的时候取出，即输出 28；
	defer fmt.Println("d1", person.age)

	// 2.defer 缓存的是结构体 Person{28} 的地址，这个地址指向的结构体没有被改变，所以输出 28.
	defer func(p *Person) {
		fmt.Println("d2", p.age)
	}(person)

	// 3.处.闭包引用，person 的值已经被改变，指向结构体 Person{29}，所以输出 29.
	defer func() {
		fmt.Println("d3", person.age)
	}()

	person = &Person{29}

	//d3 29
	//d2 28
	//d1 28
}

func f() {
	defer fmt.Println("D")
	fmt.Println("F")
}

type Person struct {
	age int
}
